home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / 8530.ASM < prev    next >
Assembly Source File  |  1989-02-21  |  2KB  |  131 lines

  1.     .MODEL    MEMMOD,C
  2.     LOCALS
  3.     %MACS
  4.     .LALL
  5.  
  6.     .CODE
  7. ; Write a 8530 register. Called from C as
  8. ; write_scc(int ctl,char reg,char val);
  9.     public    write_scc
  10. write_scc    proc
  11.     arg    ctl:word,reg:byte,val:byte
  12.     pushf
  13.     mov    dx,ctl
  14.     mov    al,reg
  15.     cmp    al,0
  16.     jz    @@doit        ; no need to set register 0
  17.     cli
  18.     out    dx,al
  19. ; allow enough delay for 10 MHz 80286 and a 3.6 MHz 8530
  20. ; each nop is 3 clock ticks (300 ns @ 10 MHz).
  21. ; The 8530 requires a delay of 6 PCLK cycles (1.666 uS at 3.6 MHz)
  22.     nop
  23.     nop
  24.     nop
  25.     nop
  26.     nop
  27.     nop
  28. @@doit:    mov    al,val
  29.     out    dx,al
  30.     popf
  31.     ret
  32. write_scc    endp
  33.  
  34. ; Read a 8530 register. Called from C as
  35. ; read_scc(int ctl,char reg);
  36.     public    read_scc
  37. read_scc    proc
  38.     arg    ctl:word,reg:byte
  39.     pushf
  40.     mov    dx,ctl
  41.     mov    al,reg
  42.     cmp    al,0
  43.     jz    @@doit    ; no need to set reg if R0
  44.     cli
  45.     out    dx,al
  46. ; allow enough delay for 10 MHz 80286 and a 3.6 MHz 8530
  47.     nop
  48.     nop
  49.     nop
  50.     nop
  51.     nop
  52.     nop
  53. @@doit:    in    al,dx
  54.     mov    ah,0
  55.     popf
  56.     ret
  57. read_scc    endp
  58.  
  59. ; Read packets from the 8530 receiver.
  60. ; Returns when either a good frame is received, or when carrier drops.
  61. ; If a good frame is received, the length is returned; otherwise -1.
  62.     public    rx8530
  63. rx8530    proc
  64.     arg    ctl:word,data:word,buf:ptr,bufsize:word    
  65.     uses    di
  66.  
  67. @@restart:
  68.     if    @Datasize NE 0
  69.         les    di,buf
  70.     else
  71.         mov    di,buf    ; cp = buf
  72.         mov    ax,ds
  73.         mov    es,ax
  74.     endif
  75.  
  76.     cld
  77.     mov    cx,0        ; cnt = 0
  78. @@rxloop:
  79.     mov    dx,ctl    ; read status
  80.     in    al,dx        ; into al
  81.     test    al,08h        ; DCD still present?
  82.     jz    @@dcdoff    ; nope, quit
  83.     test    al,080h        ; Abort?
  84.     jnz    @@restart    ; yes, start again
  85.     test    al,01h        ; character available?
  86.     jz    @@nochar    ; nope, go on
  87.     mov    dx,data
  88.     in    al,dx        ; get it
  89.     stosb            ; and stash: *cp++ = char
  90.     inc    cx        ; cnt++
  91.     cmp    cx,bufsize    ; cx == bufsize?
  92.     jnz    @@rxloop
  93.  
  94.     mov    dx,ctl    ; buffer overflowed; abort receiver
  95.     mov    al,3        ; select register 3
  96.     out    dx,al
  97.     mov    al,0d9h        ; ENT_HM|RxENABLE|RxCRC_ENAB|Rx8
  98.     nop
  99.     nop
  100.     nop
  101.     nop
  102.     nop
  103.     out    dx,al
  104.     jmp    @@restart
  105. @@nochar:
  106.     mov    al,1        ; Select error register (R1)
  107.     mov    dx,ctl
  108.     out    dx,al
  109.     nop
  110.     nop
  111.     nop
  112.     nop
  113.     nop
  114.     nop
  115.     in    al,dx        ; read error reg (R1)
  116.     test    al,080h        ; end of frame?
  117.     jz    @@rxloop    ; nope, keep looking
  118.  
  119.     test    al,040h        ; End of frame. CRC error?
  120.     jnz    @@restart    ; yup; start again
  121.     mov    ax,cx        ; good frame; return with count
  122.     ret
  123.  
  124. @@dcdoff:
  125.     mov    ax,0ffffh    ; DCD dropped, return -1
  126.     ret
  127.  
  128. rx8530    endp
  129.     end
  130.  
  131.